1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : teams/classes/class.team.inc.php
5 : - Modulgruppe: Teams
6 : - Beschreibung: Klasse zum Erstellen eines Team-Objekts
7 : und Bereitstellen von zugehörigen Funktionen.
8 : - Version: 0.2, 05/11/06
9 : - Autor(en): Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
10 : +---------------------------------------------------------------------------+
11 : This program is free software; you can redistribute it and/or
12 : modify it under the terms of the GNU General Public License
13 : as published by the Free Software Foundation; either version 2
14 : of the License, or any later version.
15 : +---------------------------------------------------------------------------+
16 : This program is distributed in the hope that it will be useful,
17 : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : GNU General Public License for more details.
20 : You should have received a copy of the GNU General Public License
21 : along with this program; if not, write to the Free Software
22 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 : +--------------------------------------------------------------------------*/
24 : /**
25 : * Klasse zum Erstellen eines Team-Objekts
26 : * und Bereitstellen von zugehörigen Funktionen.
27 : * @package eStudy.Teams
28 : * @version 0.2, 05/11/06
29 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
30 : */
31 1 : require_once ("class.style.inc.php");
32 1 : class Team {
33 : /**
34 : * ID des Teams
35 : * @var integer
36 : * @access private
37 : */
38 : var $ID;
39 : /**
40 : * Name des Teams
41 : * @var string
42 : * @access private
43 : */
44 : var $name;
45 : /**
46 : * Kurs-ID des Teams
47 : * @var integer
48 : * @access private
49 : */
50 : var $courseID;
51 : /**
52 : * Maximale Teilnehmerzahl des Teams
53 : * @var integer
54 : * @access private
55 : */
56 : var $maxMembers;
57 : /**
58 : * Team-Style
59 : * @var string
60 : * @access private
61 : */
62 : var $style;
63 : /**
64 : * Team-Logo
65 : * @var string
66 : * @access private
67 : */
68 : var $logo;
69 : /**
70 : * Fehlerstrings
71 : * @var string
72 : * @access private
73 : */
74 : var $errors;
75 : /**
76 : * Konstruktor.
77 : * Erstellt das Team-Objekt mit den Daten des per ID bestimmten Teams.
78 : * Wird eine ungültige ID (oder 0) übergeben, wird ein neues Team
79 : * erstellt.
80 : *
81 : * @access public
82 : * @param int $teamID ID des Teams oder 0 für neues Team
83 : */
84 : function Team($teamID) {
85 0 : global $db, $settings;
86 0 : $dbp = $settings["dbPrefix"];
87 0 : $this->errors = "";
88 0 : $newTeam = false;
89 0 : if (strval(intval($teamID)) == $teamID && $teamID > 0) {
90 0 : $teamData = $db->get_row("SELECT * FROM {$dbp}teams WHERE id='$teamID'");
91 0 : if ($db->num_rows) {
92 0 : $this->ID = (int)$teamData->id;
93 0 : $this->name = $teamData->name;
94 0 : $this->courseID = (int)$teamData->course_id;
95 0 : $this->maxMembers = (int)$teamData->max_members;
96 0 : $this->style = $teamData->style;
97 0 : $this->logo = $teamData->logo;
98 0 : } else {
99 0 : $newTeam = true;
100 : }
101 0 : } else {
102 0 : $newTeam = true;
103 : }
104 0 : if ($newTeam) {
105 0 : $this->setDefaultValues();
106 0 : }
107 0 : }
108 : /**
109 : * Versucht, die im übergebenen Array vorhandenen Daten anhand der
110 : * assoziativen Array-Indizes als neue Team-Daten abzuspeichern. Dabei
111 : * kann es sich zum Beispiel um das $_POST-Array handeln. Es werden dabei
112 : * entweder alle oder keine Daten gespeichert. Sind einige der Daten
113 : * fehlerhaft, wird ein String mit Fehlermeldungen in $this->errors gespeichert
114 : * und false zurückgegeben, sonst true.
115 : *
116 : * @access public
117 : * @param array $data Assoziatives Array mit den neuen Werten
118 : * @return boolean Erfolgswert
119 : */
120 : function setData($data) {
121 0 : $this->errors = "";
122 0 : if (($result = $this->validateName($data["name"])) !== true) {
123 0 : $this->errors.= $result."\n";
124 0 : }
125 0 : if (($result = $this->validateMaxMembers($data["maxMembers"])) !== true) {
126 0 : $this->errors.= $result."\n";
127 0 : }
128 0 : if (($result = $this->validateStyle($data["style"])) !== true) {
129 0 : $this->errors.= $result."\n";
130 0 : }
131 0 : if (($result = $this->validateLogo($data["logo"])) !== true) {
132 0 : $this->errors.= $result."\n";
133 0 : }
134 0 : if (empty($this->errors)) {
135 0 : if (!$this->setName($data["name"])) {
136 0 : $this->errors.= "Name konnte nicht gespeichert werden.\n";
137 0 : return false;
138 : }
139 0 : if (!$this->setMaxMembers($data["maxMembers"])) {
140 0 : $this->errors.= "Maximale Teilnehmerzahl konnte nicht gespeichert werden.";
141 0 : return false;
142 : }
143 0 : if (!$this->setStyle($data["style"])) {
144 0 : $this->errors.= "Style konnte nicht gespeichert werden.";
145 0 : return false;
146 : }
147 0 : if (!$this->setLogo($data["logo"])) {
148 0 : $this->errors.= "Logo konnte nicht gespeichert werden.";
149 0 : return false;
150 : }
151 0 : return true;
152 : }
153 0 : return false;
154 : }
155 : /**
156 : * Erstellt den grundlegenden Datenbankeintrag für das Team. Gesetzt wird
157 : * nur die Kurs-ID, die anderen Felder werden mit ihren Standardwerten belegt.
158 : *
159 : * @access private
160 : * @return boolean Erfolgswert
161 : */
162 : function createTeam() {
163 0 : global $db, $settings;
164 0 : $dbp = $settings["dbPrefix"];
165 0 : $db->query("INSERT INTO {$dbp}teams (course_id) VALUES ('$this->courseID')");
166 0 : if ($db->rows_affected) {
167 0 : $this->ID = $db->insert_id;
168 0 : return true;
169 : }
170 0 : return false;
171 : }
172 : /**
173 : * Löscht dieses Team und alle Zuordnungen zu Mitgliedern. Alle
174 : * Eigenschaften dieses Objekts werden auf Standardwerte gesetzt, so dass
175 : * damit gleich ein neues Team erzeugt werden kann.
176 : *
177 : * @access public
178 : * @return boolean Erfolgswert
179 : */
180 : function deleteTeam() {
181 0 : global $db, $settings;
182 0 : $dbp = $settings["dbPrefix"];
183 0 : $db->query("DELETE FROM {$dbp}teams WHERE id='$this->ID'");
184 0 : if (!$db->rows_affected) {
185 0 : return false;
186 : }
187 0 : $db->query("DELETE FROM {$dbp}user_team WHERE team_id='$this->ID'");
188 0 : $db->query("DELETE FROM {$dbp}team_artefacts WHERE team_id='$this->ID'");
189 0 : $this->setDefaultValues();
190 0 : return true;
191 : }
192 : /**
193 : * Setzt Standardwerte für dieses Objekt, speichert die Änderungen aber
194 : * nicht in der Datenbank.
195 : *
196 : * @access private
197 : * @return void
198 : */
199 : function setDefaultValues() {
200 0 : $this->ID = 0;
201 0 : $this->name = "";
202 0 : $this->courseID = $_SESSION["course"];
203 0 : $this->maxMembers = 0;
204 0 : $this->style = "";
205 0 : $this->logo = "";
206 0 : }
207 : /**
208 : * Gibt eine Tabellenzeile aus, die die Formularelemente zum Bearbeiten der
209 : * Team-Eigenschaften enthält und eventuelle Fehlermeldungen.
210 : *
211 : * @access public
212 : * @param array $data Assoziatives Array der im Formular anzuzeigenden Daten
213 : * @return void
214 : */
215 : function echoFormRow($data = null) {
216 0 : if (isset($data["name"])) $name = Data::gpcUnescape($data["name"]);
217 0 : else $name = $this->name;
218 0 : if (isset($data["maxMembers"])) $maxMembers = Data::gpcUnescape($data["maxMembers"]);
219 0 : else $maxMembers = $this->maxMembers;
220 0 : if (isset($data["style"])) $teamStyle = Data::gpcUnescape($data["style"]);
221 0 : else $teamStyle = $this->style;
222 0 : if (isset($data["logo"])) $logo = Data::gpcUnescape($data["logo"]);
223 0 : else $logo = $this->logo;
224 0 : echo "<tr";
225 0 : if (!empty($this->errors)) {
226 0 : echo " class='error'>"."<td colspan='5'>".nl2br(Data::toHTML($this->errors, false)) ."</td>"."</tr><tr class='error'";
227 0 : }
228 0 : echo "><td style='text-align: center;'>".($this->ID == 0 ? "<strong>Neu:</strong>" : "<input type='checkbox' value='".$this->ID."' name='teams[]' />") ."</td>"."<td><input type='text' name='name".$this->ID."' value=\"".Data::toHTML($name, false) ."\" maxlength='100' size='24' /></td>"."<td><input type='text' name='maxMembers".$this->ID."' value=\"".Data::toHTML($maxMembers, false) ."\" maxlength='4' size='5' /></td>";
229 0 : $styles = Style::getStyleTemplates();
230 0 : echo "<td><select name='style".$this->ID."'>";
231 0 : echo "<option value='' style='font-style: italic;'>Benutzer-Style</option>";
232 0 : foreach($styles as $style) {
233 0 : echo "<option value=\"$style[0]\"".($style[0] == $teamStyle ? " selected='selected'" : "") .">".Data::toHTML($style[1], false) ."</option>";
234 0 : }
235 0 : echo "</select></td>";
236 0 : echo "<td><input type='text' name='logo".$this->ID."' value=\"".Data::toHTML($logo, false) ."\" maxlength='100' size='24' /></td>";
237 0 : echo "</tr>\n";
238 0 : }
239 : /**
240 : * Gibt die ID des Teams zurück.
241 : *
242 : * @access public
243 : * @return int ID des Teams
244 : */
245 : function getID() {
246 0 : return $this->ID;
247 : }
248 : /**
249 : * Gibt den Namen des Teams zurück.
250 : *
251 : * @access public
252 : * @return string Name des Teams
253 : */
254 : function getName() {
255 0 : return $this->name;
256 : }
257 : /**
258 : * Überprüft den übergebenen Namen auf Gültigkeit.
259 : *
260 : * @access public
261 : * @param string $name Der zu überprüfende String
262 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
263 : */
264 : function validateName($name) {
265 0 : global $db, $settings;
266 0 : $dbp = $settings["dbPrefix"];
267 0 : $name = trim(Data::gpcUnescape($name));
268 0 : if (empty($name)) return "Der Name wurde nicht angegeben.";
269 0 : if (!preg_match("/^[a-zäöüßÄÖÜ0-9\/\-_ \(\)&'\"\.,]+$/i", $name)) return "Der Name enthält ungültige Zeichen.";
270 0 : if (strlen($name) > 100) return "Der Name ist zu lang.";
271 0 : if ($this->ID == 0 && $db->get_var("SELECT COUNT(*) FROM {$dbp}teams WHERE name='".Data::toMysql($name, false) ."' AND course_id='$this->courseID'") > 0) return "Ein Team mit diesem Namen ist bereits vorhanden.";
272 0 : return true;
273 : }
274 : /**
275 : * Speichert den übergebenen String als neuen Namen dieses Teams.
276 : * Der String sollte vorher mit der Methode validateName() validiert worden
277 : * sein!
278 : *
279 : * @access public
280 : * @param string $name Zu speichernder Name
281 : * @return boolean Erfolgswert
282 : */
283 : function setName($name) {
284 0 : global $db, $settings;
285 0 : $dbp = $settings["dbPrefix"];
286 0 : $name = trim($name);
287 0 : if ($this->name == Data::gpcUnescape($name)) {
288 0 : return true;
289 : }
290 0 : if ($this->ID == 0) {
291 0 : if (!$this->createTeam()) {
292 0 : return false;
293 : }
294 0 : }
295 0 : $db->query("UPDATE {$dbp}teams SET name='".Data::toMysql($name) ."' WHERE id='$this->ID'");
296 0 : if ($db->rows_affected) {
297 0 : $this->name = Data::gpcUnescape($name);
298 0 : return true;
299 : }
300 0 : return false;
301 : }
302 : /**
303 : * Gibt den Style des Teams zurück.
304 : *
305 : * @access public
306 : * @return string Style des Teams
307 : */
308 : function getStyle() {
309 0 : return $this->style;
310 : }
311 : /**
312 : * Überprüft den übergebenen Style auf Gültigkeit.
313 : *
314 : * @access public
315 : * @param string $name Der zu überprüfende String
316 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
317 : */
318 : function validateStyle($name) {
319 0 : global $db, $settings;
320 0 : $dbp = $settings["dbPrefix"];
321 0 : $name = trim(Data::gpcUnescape($name));
322 0 : if (empty($name)) {
323 0 : return true;
324 : }
325 0 : $styles = Style::getStyleTemplates();
326 0 : foreach($styles as $style) {
327 0 : if ($style[0] == $name) {
328 0 : return true;
329 : }
330 0 : }
331 0 : return "Ungültige Style-Angabe.";
332 : }
333 : /**
334 : * Speichert den übergebenen String als neuen Style dieses Teams.
335 : * Der String sollte vorher mit der Methode validateStyle() validiert worden
336 : * sein!
337 : *
338 : * @access public
339 : * @param string $name Zu speichernder Style
340 : * @return boolean Erfolgswert
341 : */
342 : function setStyle($name) {
343 0 : global $db, $settings;
344 0 : $dbp = $settings["dbPrefix"];
345 0 : $name = trim($name);
346 0 : if ($this->style == Data::gpcUnescape($name)) {
347 0 : return true;
348 : }
349 0 : if ($this->ID == 0) {
350 0 : if (!$this->createTeam()) {
351 0 : return false;
352 : }
353 0 : }
354 0 : if (empty($name)) {
355 0 : $styleSQL = "NULL";
356 0 : } else {
357 0 : $styleSQL = "'".Data::toMysql($name) ."'";
358 : }
359 0 : $db->query("UPDATE {$dbp}teams SET style=$styleSQL WHERE id='$this->ID'");
360 0 : if ($db->rows_affected) {
361 0 : $this->style = Data::gpcUnescape($name);
362 0 : return true;
363 : }
364 0 : return false;
365 : }
366 : /**
367 : * Gibt das Logo des Teams zurück.
368 : *
369 : * @access public
370 : * @return string Logo des Teams
371 : */
372 : function getLogo() {
373 0 : return $this->logo;
374 : }
375 : /**
376 : * Überprüft die übergebene Logo-URL auf Gültigkeit.
377 : *
378 : * @access public
379 : * @param string $url Der zu überprüfende String
380 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
381 : */
382 : function validateLogo($url) {
383 0 : $url = trim(Data::gpcUnescape($url));
384 0 : if (!empty($url) && !Utilities::validateURL($url)) {
385 0 : return "Ungültige Logo-URL.";
386 : }
387 0 : return true;
388 : }
389 : /**
390 : * Speichert den übergebenen String als neues Logo dieses Teams.
391 : * Der String sollte vorher mit der Methode validateLogo() validiert worden
392 : * sein!
393 : *
394 : * @access public
395 : * @param string $name Zu speicherndes Logo
396 : * @return boolean Erfolgswert
397 : */
398 : function setLogo($name) {
399 0 : global $db, $settings;
400 0 : $dbp = $settings["dbPrefix"];
401 0 : $name = trim($name);
402 0 : if ($this->logo == Data::gpcUnescape($name)) {
403 0 : return true;
404 : }
405 0 : if ($this->ID == 0) {
406 0 : if (!$this->createTeam()) {
407 0 : return false;
408 : }
409 0 : }
410 0 : if (empty($name)) {
411 0 : $logoSQL = "NULL";
412 0 : } else {
413 0 : $logoSQL = "'".Data::toMysql($name) ."'";
414 : }
415 0 : $db->query("UPDATE {$dbp}teams SET logo=$logoSQL WHERE id='$this->ID'");
416 0 : if ($db->rows_affected) {
417 0 : $this->logo = Data::gpcUnescape($name);
418 0 : return true;
419 : }
420 0 : return false;
421 : }
422 : /**
423 : * Gibt die maximale Anzahl von Team-Mitgliedern zurück.
424 : *
425 : * @access public
426 : * @return int Maximale Anzahl Team-Mitglieder
427 : */
428 : function getMaxMembers() {
429 0 : return $this->maxMembers;
430 : }
431 : /**
432 : * Überprüft den übergebenen Wert der maximalen Teilnehmerzahl auf Gültigkeit.
433 : * Der Wert muss ein Integer >= 0 sein.
434 : *
435 : * @access public
436 : * @param mixed $maxMembers Der zu überprüfende String oder Integer
437 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
438 : */
439 : function validateMaxMembers($maxMembers) {
440 0 : if (strval(intval($maxMembers)) != $maxMembers || $maxMembers < 0) {
441 0 : return "Ungültiger Wert der maximalen Teilnehmerzahl.";
442 : }
443 0 : return true;
444 : }
445 : /**
446 : * Speichert die übergebene Zahl als die maximale Anzahl von Team-Mitgliedern.
447 : *
448 : * @access public
449 : * @param int $maxMembers Zu speichernde Anzahl Team-Mitglieder
450 : * @return boolean Erfolgswert
451 : */
452 : function setMaxMembers($maxMembers) {
453 0 : global $db, $settings;
454 0 : $dbp = $settings["dbPrefix"];
455 0 : if ($this->maxMembers == $maxMembers) {
456 0 : return true;
457 : }
458 0 : if (strval(intval($maxMembers)) != $maxMembers || $maxMembers < 0) {
459 0 : return false;
460 : }
461 0 : if ($this->ID == 0) {
462 0 : if (!$this->createTeam()) {
463 0 : return false;
464 : }
465 0 : }
466 0 : $db->query("UPDATE {$dbp}teams SET max_members='$maxMembers' WHERE id='$this->ID'");
467 0 : if ($db->rows_affected) {
468 0 : $this->maxMembers = intval($maxMembers);
469 0 : return true;
470 : }
471 0 : return false;
472 : }
473 : /**
474 : * Gibt die Kurs-ID des Teams zurück.
475 : *
476 : * @access public
477 : * @return int Kurs-ID des Teams
478 : */
479 : function getCourseID() {
480 0 : return $this->courseID;
481 : }
482 : /**
483 : * Speichert den übergebenen Integer als neue Kurs-ID dieses Team.
484 : *
485 : * @access public
486 : * @param integer $courseID Zu speichernde Kurs-ID
487 : * @return boolean Erfolgswert
488 : */
489 : function setCourseID($courseID) {
490 0 : global $db, $settings;
491 0 : $dbp = $settings["dbPrefix"];
492 0 : if ($this->courseID == $courseID) {
493 0 : return true;
494 : }
495 0 : if (strval(intval($courseID)) != $courseID || $courseID < 1) {
496 0 : return false;
497 : }
498 0 : if ($this->ID == 0) {
499 0 : if (!$this->createTeam()) {
500 0 : return false;
501 : }
502 0 : }
503 0 : $db->query("UPDATE {$dbp}teams SET course_id='$courseID' WHERE id='$this->ID'");
504 0 : if ($db->rows_affected) {
505 0 : $this->courseID = intval($courseID);
506 0 : return true;
507 : }
508 0 : return false;
509 : }
510 : }
|